'use strict'
process.env.NODE_ENV = 'production'

const { say } = require('cfonts')
const { sync } = require('del')

const chalk = require('chalk')
const rollup = require("rollup")
const { build } = require('vite')
const Multispinner = require('multispinner')

const mainOptions = require('./rollup.config');
const rendererOptions = require('./vite.config')

const doneLog = chalk.bgGreen.white(' DONE ') + ' '
const errorLog = chalk.bgRed.white(' ERROR ') + ' '
const okayLog = chalk.bgBlue.white(' OKAY ') + ' '
const isCI = process.env.CI || false


if (process.env.BUILD_TARGET === 'web') web()
else unionBuild()

function clean() {
    sync(['dist/electron/main/*', 'dist/electron/renderer/*', 'dist/web/*', 'build/*', '!build/icons', '!build/lib', '!build/lib/electron-build.*', '!build/icons/icon.*'])
    console.log(`\n${doneLog}clear done`)
    if (process.env.BUILD_TARGET === 'onlyClean') process.exit()
}

async function unionBuild() {
    greeting()
    if (process.env.BUILD_TARGET === 'clean' || process.env.BUILD_TARGET === 'onlyClean') clean()

    const tasks = ['main', 'renderer']
    const m = new Multispinner(tasks, {
        preText: 'building',
        postText: 'process'
    })
    let results = ''

    m.on('success', () => {
        process.stdout.write('\x1B[2J\x1B[0f')
        console.log(`\n\n${results}`)
        console.log(`${okayLog}take it away ${chalk.yellow('`electron-builder`')}\n`)
        process.exit()
    })
    const opt = mainOptions(process.env.NODE_ENV);
    if (Array.isArray(opt)) {
        for (let i = 0; i < opt.length; i++) {
            rollup.rollup(opt[i])
                .then(build => {
                    results += `${doneLog}${opt[i].output.name} build success` + '\n\n'
                    build.write(opt[i].output).then(() => {
                        m.success('main')
                    })
                }).catch(error => {
                    m.error('main')
                    console.log(`\n  ${errorLog}failed to build ${opt[i].output.name} process`)
                    console.error(`\n${error}\n`)
                    process.exit(1)
                });
        }
    } else {
        rollup.rollup(opt)
            .then(build => {
                results += `${doneLog}MainProcess build success` + '\n\n'
                build.write(opt.output).then(() => {
                    m.success('main')
                })
            })
            .catch(error => {
                m.error('main')
                console.log(`\n  ${errorLog}failed to build main process`)
                console.error(`\n${error}\n`)
                process.exit(1)
            });
    }
    build(rendererOptions).then(res => {
        results += `${doneLog}RendererProcess build success` + '\n\n'
        m.success('renderer')
    }).catch(err => {
        m.error('renderer')
        console.log(`\n  ${errorLog}failed to build renderer process`)
        console.error(`\n${err}\n`)
        process.exit(1)
    })
}

function web() {
    sync(['dist/web/*', '!.gitkeep'])
    build(rendererOptions).then(res => {
        console.log(`${doneLog}RendererProcess build success`)
        process.exit()
    })
}

function greeting() {
    const cols = process.stdout.columns
    let text = ''

    if (cols > 85) text = `let's-build`
    else if (cols > 60) text = `let's-|build`
    else text = false

    if (text && !isCI) {
        say(text, {
            colors: ['yellow'],
            font: 'simple3d',
            space: false
        })
    } else console.log(chalk.yellow.bold(`\n  let's-build`))
    console.log()
}